package com.example.cqh_votesys.interceptor;

import com.alibaba.fastjson.JSONObject;
import com.example.cqh_votesys.pojo.result.Result;
import com.example.cqh_votesys.utils.JwtUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import java.io.IOException;

/**
 * @Author: pollux
 * @CreateTime: 2024-06-30
 * @Description: token拦截类
 * @Version: 1.0
 */

@Component
@Slf4j
public class TokenInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler) throws Exception {
        //判断当前拦截到的是Controller的方法还是其他资源
        if (!(handler instanceof HandlerMethod)) {
            //当前拦截到的不是动态方法，直接放行
            return true;
        }
        //从请求头中获取到token这个请求头
        String token = request.getHeader("token");

        //判断请求头中有没有这个token
        //StringUtils.hasLength是一个通常用于检查字符串是否非空（不为 null 且长度大于 0）的方法调用
        //如果 token 非 null 且长度大于 0，则返回 true.否则反之
        if (!StringUtils.hasLength(token)) {
            Result<String> result = Result.error("未登录");
            //将Result对象转换成一个JSON格式的字符串。
            String jsonString = JSONObject.toJSONString(result);
            //设置响应头（告知浏览器：响应的数据类型为json、响应的数据编码表为utf-8）
            response.setContentType("application/json;charset=utf-8");
            //响应
            response.getWriter().write(jsonString);
            //不放行
            return false;
        }
        try {
            //当解析过程出错了，就会被catch捕获到
            JwtUtil.parseToken(token,"22级软件b班陈全焕jwtjwtjwtjwtjwtjwt");
        }catch (Exception e){
            Result<String> result = Result.error("token错误");
            String jsonString = JSONObject.toJSONString(result);
            response.setContentType("application/json;charset=utf-8");
            response.getWriter().write(jsonString);
            //不放行
            return false;
        }
        //上面都通过了，这里就放行了
        return true;
    }

}
